import { _decorator, Component, error, log, Node } from 'cc';
import { ModuleBase } from './ModuleBase';
import Singleton from '../FrameWork/Common/Singleton';
const { ccclass, property } = _decorator;

@ccclass('ModuleMgr')
export class ModuleMgr extends Singleton<ModuleMgr>() {
    //使用单例模式

    //创建容器用于存储模块
    private _moduleMap: Map<string, ModuleBase> = new Map();
    //添加模块
    addModule(moduleName: string, module: ModuleBase) {
        //容器中是否存在此模块
        if (this._moduleMap.has(moduleName)) {
            console.error(moduleName + "模块已存在");
            return;
        }
        this._moduleMap.set(moduleName, module);
    }

    //获取模块
    getModule<T>(moduleName: string) {
        if (moduleName.length <= 0 || !moduleName) {
            console.error("模块名字有误");
            return;
        }
        let module = this._moduleMap.get(moduleName);
        if (!module) {
            console.error(moduleName + "模块不存在");
            return;
        }
        return module as T;
    }

    //删除模块
    deleteModule(moduleName: string) {
        if (moduleName.length <= 0 || !moduleName) {
            console.error("模块名字有误");
            return;
        }
        this._moduleMap.delete(moduleName);
    }

    //清空容器
    clearModule() {
        this._moduleMap.clear();
    }

    // 模块化生命周期函数
    onInitModule(...rest: any[]) {
        for (let value of Array.from(this._moduleMap.values())) {
            // 遍历map容器中的所有模块 并且调用onInit方法
            // arguments 是参数数组
            // apply 改变this指向，传参
            value.onInit.apply(value, arguments);
        }
    }

    onLateInitModule(...rest: any[]) {
        for (let value of Array.from(this._moduleMap.values())) {
            value.onLateInit.apply(value, arguments);
        }
    }

    onUpdateModule(deltaTime: number, ...rest: any[]) {
        for (let value of Array.from(this._moduleMap.values())) {
            value.onUpdate.apply(value, arguments);
        }
    }

    onLateUpdateModule(deltaTime: number, ...rest: any[]) {
        for (let value of Array.from(this._moduleMap.values())) {
            value.onLateUpdate.apply(value, arguments);
        }
    }

    // 发送消息 实现模块之间的交互 消息也就是需要调用的函数
    sendMessage(msgName: string, moduleName: string, ...rest: any[]) {
        if (!msgName && moduleName.length <= 0) {
            error("模块名或消息名不存在");
            return;
        }

        // 如果消息名存在 模块名不存在 直接调用所有模块名的该消息函数
        if (msgName && moduleName.length <= 0) {
            for (let value of Array.from(this._moduleMap.values())) {
                // 拿到对应的模块
                let cb = value[msgName];
                if (cb) {
                    cb.apply(value, rest);
                    continue;
                }
            }
        }

        // 如果消息名不存在 模块名存在 调用该模块的默认消息函数
        if (!msgName && moduleName.length > 0) {
            let module = this.getModule<ModuleBase>(moduleName);
            module.defaultMessage.apply(module, rest);
        }

        // 如果都存在 那就调用指定模块的消息函数
        if (msgName && moduleName.length > 0) {
            console.log(this._moduleMap);
            let module = this.getModule<ModuleBase>(moduleName);
            let fun = module[msgName];
            fun.apply(module, rest);
        }
    }
}